package main

/*
* Content: 数组声明-初始化方式、数组取值、数组的遍历、二维数组、map类型的切片
* --------------------------------------------------
* Go 数组详解和实战: https://juejin.cn/post/7072165701036802055
 */

import "fmt"

func MyArray() {

	// 数组声明-初始化方式
	fmt.Println("--------------------数组声明-初始化方式--------------------")

	// 声明数组
	var a1 [2]int
	var a2 [3]string
	a1[1] = 12
	fmt.Printf("a1类型: %T, a2类型: %T\n", a1, a2)

	// 初始化方式1 - 最不常用的方式
	var a3 [3]int = [3]int{1, 2, 3}
	fmt.Printf("a3: %v\n", a3)

	// 初始化方式2 - 自动判断类型
	var a4 = [3]int{1, 2, 3}
	var a5 = [3]int{3, 6} // 元素个数 比 声明的元素个数 少
	fmt.Printf("a4: %v, a5: %v\n", a4, a5)

	// 初始化方式3 - 最常用的方式
	a6 := [3]int{1, 2, 3}
	fmt.Printf("a3: %v\n", a6)

	// 初始化方式4 - 省略长度
	intArr4 := [...]int{1, 2, 3} // 声明数组并初始化, 省略长度...
	fmt.Printf("intArr4 的长度: %v\n", len(intArr4))

	// 数组取值
	fmt.Println("--------------------数组取值--------------------")

	// 定义数组
	intArr8 := [3]int{11, 22, 33}

	// 访问数组元素
	fmt.Printf("intArr8的下标为1的元素是: %v\n", intArr8[1])

	// 数组赋值
	intArr8[1] = 12
	fmt.Printf("intArr8的下标为1的元素是: %v\n", intArr8[1])

	// 数组的遍历
	fmt.Println("--------------------数组的遍历--------------------")

	// 遍历方式1
	for i := 0; i < len(intArr8); i++ {
		fmt.Printf("intArr8[%v]: %v\n", i, intArr8[i])
	}

	// 遍历方式2: 更常用的方式
	for index, value := range intArr8 {
		fmt.Printf("intArr8[%v]: %v\n", index, value)
	}

	// 二维数组
	fmt.Println("--------------------二维数组--------------------")

	//定义多维数组
	var a11 [2][3]int

	//初始化多维数组
	a11 = [2][3]int{
		[3]int{1, 2, 3},
		[3]int{4, 5, 6}, //注意：最后这个也要加逗号分隔
	}
	// 等价: a11 := [2][3]int{{1, 2, 3}, {4, 5, 6}} //注意：最后这个也要加逗号分隔

	fmt.Println(a11)

	// 二维数组遍历
	//双重for range遍历取值
	for _, v1 := range a11 {
		fmt.Println(v1)
		for _, v2 := range v1 {
			fmt.Println(v2)
		}
	}

	// map类型的切片
	fmt.Println("--------------------map类型的切片--------------------")

	mSlice := make([]map[string]int, 10)
	mSlice[0] = make(map[string]int) // 先初始化map
	mSlice[0]["北京"] = 100            // 赋值
	fmt.Println(mSlice)
}

// 数组、切片实战
func answer1(arr []int, num int) {
	i, j := 0, len(arr)-1
	for i < j {
		if arr[i]+arr[j] == num {
			fmt.Printf("i: %v, j: %v\n", i, j)
			i++
		} else if arr[i]+arr[j] > num {
			j--
		} else {
			i++
		}
	}
}
